#ifndef DEVELOPERMODEPLUGIN_H
#define DEVELOPERMODEPLUGIN_H

#include "CameraPluginInterface.h"
#include "DeveloperModeDialog.h"
#include "ConfigManager.h"

class DeveloperModePlugin : public CameraPluginInterface
{
    Q_OBJECT
    Q_INTERFACES(CameraPluginInterface)
    Q_PLUGIN_METADATA(IID "Camera.CameraPluginInterface/1.0")
    Q_PROPERTY(QString pluginName READ pluginName CONSTANT)
    Q_PROPERTY(QString description READ description CONSTANT)
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针
     */
    Q_INVOKABLE explicit DeveloperModePlugin(QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~DeveloperModePlugin() override;

    /**
     * @brief 初始化插件
     * @details 执行插件启动所需的初始化操作，如连接相机、加载配置等
     */
    void initialize() override;
    
    /**
     * @brief 获取插件名称
     * @return 插件名称字符串
     */
    QString pluginName() const override;
    
    /**
     * @brief 获取插件描述信息
     * @return 插件描述字符串
     */
    QString description() const override;
public slots:
    /**
     * @brief 接收插件消息
     * @param sender 发送消息的插件名称
     * @param message 消息内容
     */
    void onPluginMessage(const QString& sender, const QString& message) override;
    
    /**
     * @brief 写入日志
     * @param logInfo 日志信息
     * @param logLevel 日志级别（0: INFO, 1: WARNING, 2: ERROR）
     * @param isSave 是否保存到文件
     */
    void onWriteLog(const QString& logInfo,int logLevel=0,bool isSave=false);

public:
    // ConfigManager接口方法 - 所有返回值和参数都使用QVariant
    
    /**
     * @brief 获取单个配置参数
     * @param configName 配置名称
     * @param paramName 参数名称
     * @param defaultValue 默认值，当参数不存在时返回
     * @return 参数值，如果参数不存在则返回默认值
     */
    Q_INVOKABLE QVariant getConfigParam(const QVariant &configName, const QVariant &paramName, const QVariant &defaultValue = QVariant()) const;
    
    /**
     * @brief 批量获取配置参数
     * @param configName 配置名称
     * @param paramNames 参数名称列表
     * @return 参数名称到值的映射
     */
    Q_INVOKABLE QVariant batchGetConfigParams(const QVariant &configName, const QVariant &paramNames) const;
    
    /**
     * @brief 获取所有配置参数
     * @param configName 配置名称
     * @return 所有参数的映射
     */
    Q_INVOKABLE QVariant getConfigParams(const QVariant &configName) const;
    
    /**
     * @brief 设置单个配置参数
     * @param configName 配置名称
     * @param paramName 参数名称
     * @param value 参数值
     */
    Q_INVOKABLE void setConfigParam(const QVariant &configName, const QVariant &paramName, const QVariant &value);
    
    /**
     * @brief 批量设置配置参数
     * @param configName 配置名称
     * @param configParams 参数名称到值的映射
     */
    Q_INVOKABLE void batchSetConfigParams(const QVariant &configName, const QVariant &configParams);
    
    /**
     * @brief 设置所有配置参数
     * @param configName 配置名称
     * @param configParams 参数名称到值的映射
     */
    Q_INVOKABLE void setConfigParams(const QVariant &configName, const QVariant &configParams);
    
    /**
     * @brief 从文件加载配置
     * @param filePath 文件路径，如果为空则使用默认路径
     * @return 加载是否成功
     */
    Q_INVOKABLE QVariant loadConfig(const QVariant &filePath = QVariant());
    
    /**
     * @brief 保存配置到文件
     * @param filePath 文件路径，如果为空则使用默认路径
     * @return 保存是否成功
     */
    Q_INVOKABLE QVariant saveConfig(const QVariant &filePath = QVariant());
    
    /**
     * @brief 添加新配置
     * @param configName 配置名称
     * @param configParams 参数名称到值的映射
     */
    Q_INVOKABLE void addConfig(const QVariant &configName, const QVariant &configParams = QVariant());
    
    /**
     * @brief 删除配置
     * @param configName 配置名称
     */
    Q_INVOKABLE void removeConfig(const QVariant &configName);
    
    /**
     * @brief 检查配置是否存在
     * @param configName 配置名称
     * @return 配置是否存在
     */
    Q_INVOKABLE QVariant containsConfig(const QVariant &configName) const;
    
    /**
     * @brief 获取所有配置名称
     * @return 配置名称列表
     */
    Q_INVOKABLE QVariant getConfigNames() const;
    
    /**
     * @brief 检查配置参数是否存在
     * @param configName 配置名称
     * @param paramName 参数名称
     * @return 参数是否存在
     */
    Q_INVOKABLE QVariant containsConfigParam(const QVariant &configName, const QVariant &paramName) const;
    
    /**
     * @brief 注册预设参数菜单项
     * @param menuText 菜单项文本
     * @return 菜单项动作的QVariant包装
     */
    Q_INVOKABLE QVariant registerPresetParamMenuItem(const QVariant &menuText);

    /**
     * @brief 注册预设参数菜单项
     * @param menuText 菜单项文本
     * @param dialog 弹出对话框
     * @return 菜单项动作的QVariant包装
     */
    Q_INVOKABLE QVariant registerPresetParamMenuItem(const QVariant &menuText,const QVariant &dialog);

    /**
     * @brief isVerified 是否验证
     * @return 是否验证
     */
    Q_INVOKABLE QVariant isVerified(){return m_isVerified;}
private:
    /**
     * @brief 弹出开发者模式对话框
     */
    void showDeveloperModeDialog();
    
private:

    // 子菜单
    QMenu *m_developerSubMenu;

    // 验证状态标志
    bool m_isVerified;

    ConfigManager* m_pConfigManager;

};

#endif // DEVELOPERMODEPLUGIN_H
